﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Controllers;
using GestorDeFlotasDesktop.Listados;

namespace GestorDeFlotasDesktop
{
    public partial class RegistrarViajes : Form
    {
        public RegistrarViajes()
        {
            InitializeComponent();
        }

        #region Propiedades
        private bool valido = true;
        private Cliente _clienteseleccionado;
        public Cliente clienteseleccionado
        {
            get { return _clienteseleccionado; }
            set
            {
                _clienteseleccionado = value;
                if (value != null)
                    txtCliente.Text = _clienteseleccionado.Cliente_Nombre;
            }
        }

        private Chofer _ChoferSeleccionado;
        public Chofer ChoferSeleccionado
        {
            get { return _ChoferSeleccionado; }
            set
            {
                _ChoferSeleccionado = value;
                if (value != null)
                    txtChofer.Text = _ChoferSeleccionado.Chofer_Dni + " " + _ChoferSeleccionado.Chofer_Nombre + " " + _ChoferSeleccionado.Chofer_Apellido;
            }
        }

        private Turno _TurnoSeleccionado;
        public Turno TurnoSeleccionado
        {
            get { return _TurnoSeleccionado; }
            set
            {
                _TurnoSeleccionado = value;
                if (value != null)
                    txtTurno.Text = _TurnoSeleccionado.Turno_Descripcion;
            }
        }
        #endregion

        #region Eventos




        private void btnSeleccionarChofer_Click(object sender, EventArgs e)
        {
            var lstchofer = new lstChoferes { operacion = Operacion.Seleccion, frmRegistrarViaje = this, frm = "registrarViaje" };
            lstchofer.Show();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            ValidarForm(sender, e);
            if (!valido) return;

            var registrarViaje = CargarObjeto();
            if  (
                (registrarViaje.Viaje_ClienteId == -1 && !RegistrarViajeController.ExisteViajeChofer(registrarViaje)) || 
                (!RegistrarViajeController.ExisteViaje(registrarViaje) && !RegistrarViajeController.ExisteViajeChofer(registrarViaje)))
            {
                RegistrarViajeController.Agregar(registrarViaje);

                MessageBox.Show("La registracion fue realizada con éxito");
                LimpiarForm();
                Close();
            }
            else
            {
                MessageBox.Show("La registracion no puede ser realizada ya que existe una con los mismos datos","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            LimpiarForm();
        }

        #endregion

        #region Metodos del Form

        private RegistrarViaje CargarObjeto()
        {
            return new RegistrarViaje
                       {
                            Viaje_Cant_Fichas = int.Parse(txtCantidadFichas.Text),
                            Viaje_ClienteId = clienteseleccionado == null ? -1 : clienteseleccionado.Cliente_Id,
                            Viaje_ChoferId = ChoferSeleccionado.Chofer_Id,
                            Viaje_AutoId = AsignacionController.ObtenerAuto(TurnoSeleccionado.Turno_Id, dtpFecha.Value, ChoferSeleccionado.Chofer_Id),
                            Viaje_TurnoId = TurnoSeleccionado.Turno_Id,
                            Viaje_TipoViajeId = ((TipoViaje)cmbTipoViaje.SelectedItem).TiVi_Id,
                            Viaje_Importe = (int.Parse(txtCantidadFichas.Text) * TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Valor_Ficha) + TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Valor_Bandera,
                            Viaje_Fecha = dtpFecha.Value
                       };
        }

        private void LimpiarForm()
        {
            //txtAuto.Text = "";
            txtChofer.Text = "";
            dtpFecha.Value = DateTime.Today;
            cmbTipoViaje.SelectedIndex = 0;
        }

        #endregion

        #region Validaciones

        private void ValidarForm(object sender, EventArgs e)
        {
            valido = true;
            ValidarCliente();
            if(valido)
                ValidarChofer();
            if(valido)
                ValidarTurno();
            if(valido)
                ValidarFechaTurno();
            if(valido)
                ValidarAuto();
            if (valido)
                ValidarFichas();
            
            
        }

        private void ValidarFichas()
        {
            if (!Utiles.EsDecimal(txtCantidadFichas.Text))
            {
                errProvider.SetError(txtCantidadFichas, "Solo puede ingresar números");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtCantidadFichas, "");
            }
        }

        private void ValidarCliente()
        {
            if(cmbTipoViaje.Text =="Cliente")
                if (string.IsNullOrEmpty(txtCliente.Text))
                {
                    errProvider.SetError(txtCliente, "Debe seleccionar un cliente");
                    valido = false;
                }
                else
                {
                    errProvider.SetError(txtCliente, "");
                }

        }

        private void ValidarTurno()
        {
            if (string.IsNullOrEmpty(txtTurno.Text))
            {
                errProvider.SetError(txtTurno, "Debe seleccionar un turno");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtTurno, "");
            }
        }

        private void ValidarFechaTurno()
        {
            if (TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Hora_Fin > TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Hora_Inicio)
            {
                if (dtpFecha.Value.Hour >= TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Hora_Inicio && dtpFecha.Value.Hour < TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Hora_Fin)
                    errProvider.SetError(dtpFecha, "");
                else
                {
                    errProvider.SetError(dtpFecha, "Turno Incorrecto");
                    valido = false;
                }
            }
            else
            {
                if ((dtpFecha.Value.Hour >= TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Hora_Inicio && dtpFecha.Value.Hour <= 23) || (dtpFecha.Value.Hour >=0 && dtpFecha.Value.Hour < TurnoController.ObtenerUno(TurnoSeleccionado.Turno_Id).Turno_Hora_Fin))
                    errProvider.SetError(dtpFecha, "");
                else
                {
                    errProvider.SetError(dtpFecha, "Turno Incorrecto");
                    valido = false;
                }
            }
        }

        private void ValidarAuto()
        {
            if (AsignacionController.ObtenerAuto(TurnoSeleccionado.Turno_Id, dtpFecha.Value, ChoferSeleccionado.Chofer_Id)== -1)
            {
                errProvider.SetError(txtChofer, "No hay ningun Auto Asignado");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtChofer, "");
            }
        }

        private void ValidarChofer()
        {
            if (string.IsNullOrEmpty(txtChofer.Text))
            {
                errProvider.SetError(txtChofer, "Debe seleccionar un chofer");
                valido = false;
            }
            else
            {
                errProvider.SetError(txtChofer, "");
            }
        }

        private void cmbTurno_Validated(object sender, EventArgs e)
        {
            if (cmbTipoViaje.SelectedValue == null || (int)cmbTipoViaje.SelectedValue == 0)
            {
                errProvider.SetError(cmbTipoViaje, "Debe seleccionar un turno");
                valido = false;
            }
            else
            {
                errProvider.SetError(cmbTipoViaje, "");
            }
        }

        #endregion

        private void RegistrarViaje_Load(object sender, EventArgs e)
        {

            cmbTipoViaje.DataSource = TipoViajeController.ObtenerTodos("",0,2);
            cmbTipoViaje.DisplayMember = "TiVi_Nombre";
            cmbTipoViaje.ValueMember = "TiVi_Id";

        }

        private void btnSeleccionaCliente_Click(object sender, EventArgs e)
        {
            var lstClientes = new lstClientes { operacion = Operacion.Seleccion, frmRegistrarViaje = this, frm = "registrarViaje" };
            lstClientes.Show();

        }

        private void btnSeleccionarTurno_Click(object sender, EventArgs e)
        {
            var lstTurnos = new lstTurnos { operacion = Operacion.Seleccion, frmRegistrarViaje = this, frm = "registrarViaje" };
            lstTurnos.Show();

        }


        private void cmbTipoViaje_SelectedValueChanged(object sender, EventArgs e)
        {
            if (cmbTipoViaje.Text == "Cliente")
                btnSeleccionaCliente.Enabled = true;
            else
            {
                btnSeleccionaCliente.Enabled = false;
                clienteseleccionado = null;
                txtCliente.Text = "";
            }
        }

    }
}
